/**
 * 常用正则表达式方法集合 
 * 注意: 每个正则表达式方法必须返回   true: 验证通过;  false: 验证不通过
 */

/* 是否外部*/
export function validExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/* 合法uri*/
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/* 小写字母*/
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/* 大写字母*/
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/* 大小写字母*/
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/* email*/
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/* 验证手机号*/
export function validPhone(phone) {
  // const reg = /^1\d{10}$/
  const reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
  return reg.test(phone)
}

/* 银行卡号*/
export function validBankNo(bankno) {
  if (bankno.length < 8 || bankno.length > 19) {
    return false
  }
  const reg = /^\d*$/ // 全数字
  return reg.test(bankno)
}

/* 数值*/
export function validNumber(num) {
  const regPos = /^\d+(\.\d+)?$/ // 非负浮点数
  // const regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/ // 负浮点数
  return regPos.test(num) || validInt(num)
}

/* 数值整数*/
export function validInt(num) {
  const regPos = /^\d+$/
  return regPos.test(num)
}

/**
 * 不为空
 * @param {Object} value 
 */
export function validNotEmpty(value) {
	const reg = /\S/; // 不为空
	return reg.test(value)
}

/**
 * 完整的身份证验证方法
 * @param {*} idcard 身份证号
 * @returns 
 */
export function validCardId(idcard) { 
  var Errors = new Array("true", "身份证号码位数不对!", "身份证号码出生日期超出范围或含有非法字符!", "身份证号码校验错误!", "身份证地区非法!"); 
  var area = { 
	11: "北京", 
	12: "天津", 
	13: "河北", 
	14: "山西", 
	15: "内蒙古", 
	21: "辽宁", 
	22: "吉林", 
	23: "黑龙江", 
	31: "上海", 
	32: "江苏", 
	33: "浙江", 
	34: "安徽", 
	35: "福建", 
	36: "江西", 
	37: "山东", 
	41: "河南", 
	42: "湖北", 
	43: "湖南", 
	44: "广东", 
	45: "广西", 
	46: "海南", 
	50: "重庆", 
	51: "四川", 
	52: "贵州", 
	53: "云南", 
	54: "西藏", 
	61: "陕西", 
	62: "甘肃", 
	63: "青海", 
	64: "宁夏", 
	65: "新疆", 
	71: "台湾", 
	81: "香港", 
	82: "澳门", 
	91: "国外"
  } 
  var retflag = false; 
  var idcard, Y, JYM; 
  var S, M; 
  var idcard_array = new Array(); 
  let ereg
  idcard_array = idcard.split(""); 
  //地区检验 
  if (area[parseInt(idcard.substr(0, 2))] == null) return Errors[4]; 
  //身份号码位数及格式检验 
  switch (idcard.length) { 
	case 15: 
	  if ((parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0 || ((parseInt(idcard.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0)) { 
		ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; //测试出生日期的合法性 
	  } else { 
		ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性 
	  } 
	  if (ereg.test(idcard)) { 
		return Errors[0]; 
	  } 
	  else { 
		return Errors[2]; 
	  } 
	  break; 
	case 18: 
	  if (parseInt(idcard.substr(6, 4)) % 4 == 0 || (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6, 4)) % 4 == 0)) { 
		ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/; //闰年出生日期的合法性正则表达式 
	  } else { 
		ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式 
	  } 
	  if (ereg.test(idcard)) { //测试出生日期的合法性 
		//计算校验位 
		S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 + parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 + parseInt(idcard_array[9]) * 3; 
		Y = S % 11; 
		M = "F"; 
		JYM = "10X98765432"; 
		M = JYM.substr(Y, 1); //判断校验位 
		if (M == idcard_array[17]) return Errors[0]; //检测ID的校验位 
		else return Errors[3]; 
	  } else return Errors[2]; 
	  break; 
	default: 
	  return Errors[1]; 
	  break; 
  } 
};